package com.xt.purchasingsystem.utils;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import com.xt.purchasingsystem.vo.Menu;

/**
 * 菜单工具类
 */
public class SysMenuUtil {

    /*
     * 排序,根据seq排序 Lambda表达式写法
     */

    public Comparator<Menu> seq2() {

        Comparator<Menu> comparator = (o1, o2) -> {
            if (!o1.getSeq().equals(o2.getSeq())) {
                return o1.getSeq() - o2.getSeq();
            } else {
                return o1.getName().compareTo(o2.getName());
            }
        };
        return comparator;
    }

    public static Comparator<Menu> seq() {
        Comparator<Menu> comparator = new Comparator<Menu>() {
            @Override
            public int compare(Menu o1, Menu o2) {
                if (!o1.getSeq().equals(o2.getSeq())) {
                    return o1.getSeq() - o2.getSeq();
                } else {
                    return o1.getName().compareTo(o2.getName());
                }

            }
        };
        return comparator;
    }

    /**
     * 获取子节点
     *
     * @param id      父节点id
     * @param allMenu 所有菜单列表
     * @return 每个根节点下，所有子菜单列表
     */
    public static List<Menu> getChild(String id, List<Menu> allMenu) {
        //子菜单
        List<Menu> childList = new ArrayList<Menu>();
        // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
        //相等说明：为该根节点的子节点。
        for (Menu menu : allMenu) {
            if (id.equals(menu.getParentId())) {
                childList.add(menu);
            }
        }
        //递归
        for (Menu menu : childList) {
            menu.setChildren(getChild(menu.getId(), allMenu));
        }
        //排序
        Collections.sort(childList, seq());
        //如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return new ArrayList<Menu>();
        }

        return childList;
    }


    /**
     * 把菜单集合递归成树状菜单集合
     *
     * @param sysMenus 菜单集合
     * @return 树状菜单集合
     */

    public static List<Menu> getMenuTree(List<Menu> sysMenus
    ) {


        // Stream 流式
        List<Menu> rootMenu =
                sysMenus.stream().filter(menu -> menu.getParentId() == null).
                        collect(Collectors.toList());

        //排序
        Collections.sort(rootMenu, seq());
        //为根菜单设置子菜单，getClild是递归调用
        for (Menu menu : rootMenu) {
            // 获取根节点下的所有子节点 使用getChild方法
            List<Menu> childList = getChild(menu.getId(), sysMenus);
            //给根节点设置子节点
            menu.setChildren(childList);
        }

        return rootMenu;
    }

}
